package com.nageoffer.shortlink.admin.config;

import com.nageoffer.shortlink.admin.common.biz.user.UserFlowRiskControlFilter;
import com.nageoffer.shortlink.admin.common.biz.user.UserTransmitFilter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * 用户配置自动装配
 */
@Configuration
public class UserConfiguration {

    /**
     * 用户信息传递过滤器
     *
     * @Bean：注解标记的方法 globalUserTransmitFilter 会被 Spring 容器调用来创建一个 FilterRegistrationBean<UserTransmitFilter> 对象。这将注册 UserTransmitFilter 作为一个过滤器。
     * FilterRegistrationBean<UserTransmitFilter>：这是 Spring Boot 提供的一个类，用于将过滤器 UserTransmitFilter 注册到 Spring 容器中，并配置其属性。
     * registration.setFilter()：创建 UserTransmitFilter 的实例.
     * registration.addUrlPatterns("/*")：指定过滤器适用于所有 URL 模式（/*），即所有的请求都会经过这个过滤器。
     *registration.setOrder(0)：设置过滤器的执行顺序。顺序值为 0 表示这个过滤器在所有过滤器中优先执行。
     *
     */
    @Bean
    public FilterRegistrationBean<UserTransmitFilter> globalUserTransmitFilter() {
        FilterRegistrationBean<UserTransmitFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new UserTransmitFilter());
        registration.addUrlPatterns("/*");
        registration.setOrder(0);
        return registration;
    }


    /**
     * 用户操作流量风控过滤器
     * PS：每个过滤器之间就是一条链路嘛，就是责任链模式的一个实现，这里我们实现setorder（）方法，设置优先级，越小优先级越高，越靠前执行。
     * 这里我们要拿到用户的上下文信息，避免了去headr中获取，直接从上下文获取（让上下文帮助做一些规范的东西）
     */
    @Bean
    @ConditionalOnProperty(name = "short-link.flow-limit.enable", havingValue = "true")
    public FilterRegistrationBean<UserFlowRiskControlFilter> globalUserFlowRiskControlFilter(
            StringRedisTemplate stringRedisTemplate,
            UserFlowRiskControlConfiguration userFlowRiskControlConfiguration) {
        FilterRegistrationBean<UserFlowRiskControlFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new UserFlowRiskControlFilter(stringRedisTemplate, userFlowRiskControlConfiguration));
        registration.addUrlPatterns("/*");
//       （小技巧） 一般设置优先级，不会挨着顺序设置，会留下步长，为了后面方便添加另外的过滤器
        registration.setOrder(10);
        return registration;
    }
}

